package com.black.utils.network.app.sftp;

import com.black.utils.commons.network.Sender;
import com.black.utils.commons.pool.PoolProperties;
import com.black.utils.file.FileTypeEnum;

/**
 * @author ylx
 */
public class SFTPSender extends Sender<SFTPClient> {
    public SFTPSender() {
        this("/sftp.properties");
    }

    public SFTPSender(String sourcePath) {
        super(new PoolProperties(sourcePath), SFTPClientFactory.class);
    }

    /**
     * 尝试发送一个文件到FTP服务器。
     *
     * @param localPath 要发送的文件位置。
     * @return 布尔值，如果文件成功发送则返回true，否则返回false。
     */
    public boolean send(String localPath) {
        // 构建远程服务器的文件路径
        String name = localPath.substring(localPath.lastIndexOf(FileTypeEnum.PATH_SEPARATOR) + 1);
        String remotePath = properties.getRootPath() + name;
        // 获取FTP客户端
        return send(localPath, remotePath);
    }

    /**
     * 尝试通过SFTP协议发送文件。
     *
     * @param localPath  本地文件路径。
     * @param remotePath 远程目标文件路径。
     * @return 如果文件成功发送返回true，否则返回false。
     */
    public boolean send(String localPath, String remotePath) {
        int attempts = 1;
        boolean isSend = false;
        // 在尝试次数未达到上限时，尝试获取并使用SFTP客户端发送文件
        while (!isSend && attempts <= properties.getMaxCount()) {
            SFTPClient sftpClient = pool.borrowObject();
            if (null != sftpClient) {
                // 尝试将本地文件存储到远程路径
                isSend = sftpClient.upload(localPath, remotePath);
            }
            // 无论成功或失败，都必须归还SFTP客户端实例到池中
            pool.returnObject(sftpClient);
            attempts++;
        }
        // 如果超过最大尝试次数还未成功，则返回false
        return isSend;
    }
}
